170 RESTORE 172:FOR I=1 TO 16:READ SCR.DN(I):NEXT ' Reverse Index routine
172 DATA &H5152,&H5053,&H00B7,&H08B4,&H10CD,&HE788,&H00B9,&HBA00,&H174F,&H01B8,&HCD07,&H5810,&H595B,&HCB5A,&H05CD,&HCBCB
174 FOR I=1 TO 27:READ SCR.CLR(I):NEXT ' Screen clearing routines
176 DATA &H00B0,&H5152,&H5053,&H00B7,&H03B4,&H10CD,&H08B4,&H10CD,&HC389,&HD189,&H4FB2,&H00B8,&HCD06,&H5810,&H003C,&H0875,&H595B,&HCB5A,&HFFB0,&HDAEB,&HC5FE,&H00B1,&H17B6,&H00B8,&HCD06,&HEB10,&HCBEB
180 FOR I=1 TO 14:SCR.UP(I)=SCR.DN(I):NEXT:SCR.UP(11)=&HCD06 'Index routine
182 FOR I=1 TO 33:READ GRAF(I):NEXT ' Pseudo-graphics characters
184 DATA 32,4,177,26,21,27,25,248,241,23,18,217,191,218,192,197,223,205,196,22,220,195,180,193,194,179,243,242,227,247,156,250,32
210 DFNUM=30:DIM DP$(30), D$(30), DT$(30)
560 IF NOT EOF(1) THEN GOSUB 605
565 GOTO 515
640 FOR I=1 TO LEN(A$):C$=MID$(A$,I,1):IF ESC THEN GOSUB 12000:GOTO 655
645 IF C$=CR$ THEN LOCATE ,1:GOTO 655 ELSE IF C$=LF$ THEN GOSUB 12085:GOTO 655 ELSE IF C$=BS$ THEN GOSUB 2650:GOTO 655 ELSE IF C$=ESC$ AND ANSI<>0 THEN ESC=-1:GOTO 655
650 IF GRAPHICS THEN IF C$<"_" THEN PRINT C$; ELSE PRINT CHR$(GRAF(ASC(C$)-94)); ELSE PRINT C$;
655 NEXT
710 B$=INKEY$:IF B$<>"" THEN RETURN 525
730 RETURN
1245 NEXT:IF EXIT THEN EXIT=0:LOCATE ROW,COL:GOTO 560
1520 IF EX=72 THEN B$=LED$+"A":GOTO 535 ELSE IF EX=75 THEN B$=LED$+"D":GOTO 535
1525 IF EX=77 THEN B$=LED$+"C":GOTO 535 ELSE IF EX=80 THEN B$=LED$+"B":GOTO 535
1530 IF EX=71 THEN 2000 ELSE IF EX=83 THEN B$=CHR$(127):GOTO 535
1540 IF EX=47 THEN 3400 ELSE IF EX=24 THEN GOSUB 12140:GOTO 515
1610 IF EX=114 OR EX=132 THEN BEEP:PRINT:IF PR=0 THEN GOSUB 12225:GOTO 515 ELSE GOSUB 12230:GOSUB 2715:GOTO 515
1680 IF EX=30 THEN IF WTH THEN GOSUB 12165:GOTO 515 ELSE GOSUB 12170:GOTO 515
1685 '
1995 GOTO 515 ' DON'T remove this line! (failsafe to return to terminal)
2007 IF NOT WTH THEN GOSUB 12170:GOSUB 2800
2130 DATA" Alt-W = Margin bell Alt-A = Width"
3035 RC=-1:IF RC$="X" THEN 4500 ELSE 560
4035 PRINT#1,Y$;:IF TR$="B" OR NOT ECH THEN 4050
4050 GOSUB 605:ROW=CSRLIN:COL=POS(0):GOSUB 4070:B$=INKEY$:IF B$="" THEN 4060
5208 IF NOT WTH THEN GOSUB 12170
5435 DATA Comm. port,"COM1:",Comm. init.,",CS,DS",Modem init.,,C/R subst.,"}",Term. type,TTY
5680 IF D$(30)="TTY" OR D$(30)="NONE" THEN ANSI=0 ELSE IF D$(30)="ANSI" OR D$(30)="VT100" THEN ANSI=1 ELSE ANSI=-1
5685 GOSUB 5815:RETURN
9015 IF ERL=225 THEN IF I=30 THEN DP$(30)="Term. type":D$(30)="TTY":GOSUB 5440:RESUME 300 ELSE RESUME 245
12000 ' Cursor Control VT52 (VIDTEX) or VT100 (ANSI)
12005 IF ANSI>0 THEN 12025 ELSE 12010
12010 ESC=0:P=INSTR("CDABFGHIJKWXYZ<=>\]^_jlmrtuvwxy",C$):IF P THEN 12015 ELSE 12055 ' VT52 (Visual 200 or VIDTEX)
12015 ON P GOTO 12100,12100,12100,12100,12155,12160,12090,12220,12210,12190,12020,12230,12120,12240,12135,12145,12150,12020,12235,12225,12230,12180,12170,12165,12175,12195,12180,12180,12180,12190,12180
12020 RETURN ' Function not implemented yet
12025 IF BRAK THEN 12030 ELSE IF PARA THEN 12065 ELSE IF C$="[" THEN 12080 ELSE IF C$="(" OR C$=")" THEN 12060 ELSE P=INSTR("=>78DEMZc",C$):IF P THEN 12070 ELSE 12055 ' VT100 (ANSI) Terminal
12030 P=INSTR("CDABHJKfhilmn",C$):IF P THEN BRAK=0:ESC=0:IF SAV$="" THEN SAV=1:PARAM(1)=0:PARAM(2)=0:GOTO 12050 ELSE 12040
12035 P=INSTR("?0123456789;",C$):IF P THEN SAV$=SAV$+C$:RETURN ELSE 12055
12040 SAV=1:PARAM(1)=0:FOR J=1 TO LEN(SAV$):IF MID$(SAV$,J,1)=";" THEN SAV=SAV+1:PARAM(SAV)=0 ELSE IF C$="?" THEN 12045 ELSE PARAM(SAV)=PARAM(SAV)*10+VAL(C$)
12045 NEXT:SAV$=""
12050 ON P GOTO 12095,12095,12095,12095,12105,12255,12250,12105,12020,12265,12270,12280,12260
12055 PRINT SAV$;C$;:SAV$="":ESC=0:BRAK=0:RETURN
12060 PARA=-1:RETURN
12065 ESC=0:PARA=0:P=INSTR("012AB",C$):IF P THEN ON P GOTO 12155,12020,12020,12160,12160 ELSE 12055
12070 ESC=0:ON P GOTO 12145,12150,12020,12020,12085,12075,12220,12245,12020
12075 LOCATE ,1:GOTO 12085
12080 BRAK=-1:RETURN
12085 GOSUB 12185:IF ROW<24 THEN LOCATE ROW+1,COL,1:RETURN ELSE P=VARPTR(SCR.UP(1)):CALL P:GOTO 12205 ' Index cursor with scroll
12090 LOCATE 1,1,1:RETURN ' Move cursor to Home
12095 IF PARAM(1)=0 THEN 12100 ELSE PRINT STRING$(PARAM(1),P+27);:RETURN
12105 P=40-40*WTH:ROW=PARAM(1):PARAM(1)=0:IF ROW=0 THEN ROW=1 'ANSI H or f codes
12110 COL=PARAM(2):PARAM(2)=0:IF COL=0 THEN COL=1
12115 IF ROW>24 OR ROW<1 OR COL>P OR COL<1 THEN RETURN ELSE 12205
12120 P=40-40*WTH:IF LEN(A$)<I+2 THEN A$=A$+INPUT$(I+2-LEN(A$),#1)
12125 I=I+1:ROW=ASC(MID$(A$,I,1))-31:I=I+1:COL=ASC(MID$(A$,I,1))-31:IF ROW>24 OR ROW<1 OR COL>P OR COL<1 THEN PRINT MID$(A$,I-2,2);:RETURN ELSE 12205 ' Position cursor with error checking for VT52
12130 ANSI=-1:LED$=ESC$:RETURN ' Change to VT52 (VIDTEX) mode
12135 ANSI= 1:LED$=ESC$+"[":RETURN ' Change to VT100 (ANSI) mode
12140 IF ANSI=0 THEN 12135 ELSE IF ANSI=1 THEN 12130 ELSE ANSI=0:LED$="":RETURN
12145 KEYPAD=-1:RETURN ' Enable Keypad codes
12150 KEYPAD= 0:RETURN ' Disable Keypad codes
12155 GRAPHICS=-1:RETURN ' Enable Character graphics
12160 GRAPHICS= 0:RETURN ' Disable Character graphics
12165 WIDTH 40:COLOR FG,BG,BG:CLS:WTH=0:SCR.CLR(11)=&H27B2:SCR.UP(9)=&H1727:SCR.DN(9)=&H1727:RETURN ' Set to 40 Width
12170 WIDTH 80:COLOR FG,BG,BG:CLS:WTH=-1:GOSUB 2800:SCR.CLR(11)=&H4FB2:SCR.UP(9)=&H174F:SCR.DN(9)=&H174F:RETURN ' Set to 80 Width
12240 PRINT#1,ESC$"/Z";:RETURN ' Terminal ID for DEC VT52
12245 PRINT#1,ESC$"[?1;11c";:RETURN ' Terminal for DEC VT100
12250 IF PARAM(1)=0 THEN 12190 ELSE IF PARAM(1)=1 THEN 12200 ELSE IF PARAM(1)=2 THEN 12195 ELSE RETURN
12255 IF PARAM(1)=0 THEN 12210 ELSE IF PARAM(1)=1 THEN 12215 ELSE IF PARAM(1)=2 THEN GOSUB 12185:LOCATE 1,1:GOSUB 12210:GOTO 12205 ELSE RETURN
12260 IF PARAM(1)=5 THEN PRINT#1,ESC$"[0n";:RETURN ELSE IF PARAM(1)=6 THEN GOSUB 12185:PRINT#1,ESC$"["STR$(ROW)";"STR$(COL)"R";:GOTO 12205
12265 IF PARAM(1)=5 THEN 12225 ELSE IF PARAM(1)=4 THEN 12230 ELSE IF PARAM(1)=0 THEN 12235 ELSE RETURN
12270 FOR J=1 TO SAV:IF PARAM(J)=2 THEN ANSI=-1
12275 NEXT:RETURN
12280 FOR J=1 TO SAV:IF PARAM(J)=0 THEN LOCATE ,,,7,7:COLOR FG,BG ELSE IF PARAM(J)=1 THEN COLOR HI ELSE IF PARAM(J)=4 THEN LOCATE ,,,1,7 ELSE IF PARAM(J)=5 THEN COLOR FG+32 ELSE IF PARAM(J)=7 THEN COLOR BG,FG